package designmode.factory;

/**
 * 工厂模式
 * 一个工厂类 XxxFactory，里面有一个静态方法，根据我们不同的参数，返回不同的派生自同一个父类（或实现同一接口）的实例对象
 * 之所以需要引入工厂模式，是因为我们往往需要使用两个或两个以上的工厂。不同工厂负责生成不同种类的产品
 */
interface Shape {
    void draw();
}

class Rectangle implements Shape {

    @Override
    public void draw() {
        System.out.println("Inside Rectangle::draw() method.");
    }
}

class Square implements Shape {

    @Override
    public void draw() {
        System.out.println("Inside Square::draw() method.");
    }
}

class Circle implements Shape {

    @Override
    public void draw() {
        System.out.println("Inside Circle::draw() method.");
    }
}

class UnRegular implements Shape {

    @Override
    public void draw() {
        System.out.println("Inside UnRegular::draw() method.");
    }
}

class RegularShapeFactory {
    //使用 getShape 方法获取形状类型的对象
    public Shape getShape(String shapeType) {
        if (shapeType == null) {
            return null;
        }
        if (shapeType.equalsIgnoreCase("CIRCLE")) {
            return new Circle();
        } else if (shapeType.equalsIgnoreCase("RECTANGLE")) {
            return new Rectangle();
        } else if (shapeType.equalsIgnoreCase("SQUARE")) {
            return new Square();
        }
        return null;
    }
}

class UnRegularShapeFactory {
    //使用 getShape 方法获取形状类型的对象
    public Shape getShape(String shapeType) {
        if (shapeType == null) {
            return null;
        }
        if (shapeType.equalsIgnoreCase("UnRegular")) {
            return new UnRegular();
        }
        return null;
    }
}

class FactoryPatternDemo {

    public static void main(String[] args) {
        //先选择一个工厂
        RegularShapeFactory shapeFactory = new RegularShapeFactory();
        UnRegularShapeFactory unRegularShapeFactory = new UnRegularShapeFactory();
        //再根据工厂生成不同的实例
        //获取 Circle 的对象，并调用它的 draw 方法
        Shape shape1 = shapeFactory.getShape("CIRCLE");
        //调用 Circle 的 draw 方法
        shape1.draw();
        //获取 Rectangle 的对象，并调用它的 draw 方法
        Shape shape2 = shapeFactory.getShape("RECTANGLE");
        //调用 Rectangle 的 draw 方法
        shape2.draw();
        //获取 Square 的对象，并调用它的 draw 方法
        Shape shape3 = shapeFactory.getShape("SQUARE");
        //调用 Square 的 draw 方法
        shape3.draw();
        Shape unRegularShape = unRegularShapeFactory.getShape("unRegularShapeFactory");
        unRegularShape.draw();
    }
}
